/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package valida.Recursos;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import valida.beans.Archivo;
import valida.beans.Campo;

/**
 *
 * @author Andres Felipe
 */
public class UtilBaseDatos {

    


    private static final String CREAR_TABLA="CREATE TABLE ";//Sentencia Crear Tabla
    private static final String TIPO_CAMPOS = "VARCHAR(30) "; //Tipo de Campos
    private static final String SPACE = " ";// Espacios
    private static final String COMA = ","; //separador de Coma


    public static List<Archivo> getListaArchivos(){
        List lista = new ArrayList();
        try {
            Connection conn = AdministradorBaseDatos.getConexion();
            PreparedStatement ps = conn.prepareStatement("SELECT * FROM APP.VAL_ARCHIVO_TABLA");
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                Archivo archivo = new Archivo(rs.getString("DESCRIPCION"));
                archivo.setNombreDBTabla(rs.getString("NOMBRE_TABLA"));
                archivo.setPrefijoArchivo(rs.getString("PREFIJO"));
                archivo.setCampos(getListaCampos(rs.getString("NOMBRE_TABLA")));
                lista.add(archivo);
            }

        } catch (Exception e) {
            System.err.println("getListaArchivos()"+e.getMessage());
        }
        return lista;
    }

    public static List<Campo> getListaCampos(String NombreArchivo){
        List lista = new ArrayList();
        try {
            Connection conn = AdministradorBaseDatos.getConexion();
            PreparedStatement ps = conn.prepareStatement("SELECT * FROM APP.VAL_CAMPOS_TABLAS WHERE NOMBRE_TABLA = ?");
            ps.setString(1, NombreArchivo);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                Campo campo = new Campo(rs.getString("DESCRIPCION"));
                campo.setIdCampo(rs.getInt("IDCAMPO"));
                campo.setNombreBDCampo(rs.getString("NOMBRE_CAMPO"));
                campo.setNombreTabla(NombreArchivo);
                lista.add(campo);
            }

        } catch (Exception e) {
            System.err.println("getListaCampos()"+e.getMessage());
        }
        return lista;
    }

    public static boolean crearArchivo(Archivo archivo) {
        Connection conn = AdministradorBaseDatos.getConexion();        
        try {           
            PreparedStatement ps = conn.prepareStatement("INSERT INTO APP.VAL_ARCHIVO_TABLA "
                    + "(NOMBRE_TABLA, DESCRIPCION, PREFIJO) "
                    + "VALUES(?,?,?)");
            ps.setString(1, archivo.getNombreDBTabla());
            ps.setString(2, archivo.getDescripcionArchivo());
            ps.setString(3, archivo.getPrefijoArchivo());
            
            if (UtilBaseDatos.crearCampos(archivo.getCampos()) && UtilBaseDatos.crearEstructuraReal(archivo)) {
                ps.execute();
                ps.close();
                conn.close();                
                return true;
            } else {               
                return false;
            }
            
        } catch (Exception e) {  
                System.err.print("crearCampos()->" + e.getMessage());
                return false;
        }
    }
    private static boolean crearCampos(List<Campo> campos) {
        Connection conn = AdministradorBaseDatos.getConexion();
        try {            
            for (int i = 0; i < campos.size(); i++) {
                PreparedStatement ps = conn.prepareStatement("INSERT INTO APP.VAL_CAMPOS_TABLAS "
                        + "(IDCAMPO, DESCRIPCION, NOMBRE_CAMPO, NOMBRE_TABLA) "
                        + "VALUES(?,?,?,?)");
                ps.setInt(1, UtilBaseDatos.getIdCampo());
                ps.setString(2, campos.get(i).getDescripcion());
                ps.setString(3, campos.get(i).getNombreBDCampo());
                ps.setString(4, campos.get(i).getNombreTabla());

                ps.execute();
            }
            return true;

        } catch (Exception e) {
                        System.err.print("crearCampos()->" + e.getMessage());
                        return false;                
        }
    }

    private static boolean crearEstructuraReal(Archivo archivo) {
        StringBuilder Consulta= new StringBuilder(CREAR_TABLA);
        Consulta.append(archivo.getNombreDBTabla());
        Consulta.append(SPACE + "(" + SPACE);
        Iterator<Campo> i = archivo.getCampos().iterator();
        while (i.hasNext()) {
            Consulta.append(i.next().getNombreBDCampo());
            Consulta.append(SPACE + TIPO_CAMPOS);
            if (i.hasNext()) {
                Consulta.append(COMA);
            }
        }
        Consulta.append(SPACE + ")");
        return UtilBaseDatos.ejecutarConsulta(Consulta.toString());
    }
    
    private static int getIdCampo() {
        try {
            Connection conn = AdministradorBaseDatos.getConexion();
            PreparedStatement ps = conn.prepareStatement("SELECT MAX(IDCAMPO) AS ID from APP.VAL_CAMPOS_TABLAS");
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                return (rs.getInt("ID")+1);
            }else
            {
                return 1;
            }
        } catch (Exception e) {
            System.err.println("getIdCampo()"+e.getMessage());
            return 0;
        }
    }

    private static boolean ejecutarConsulta(String SQLConsulta) {
        try{
            Connection conn = AdministradorBaseDatos.getConexion();
            PreparedStatement ps = conn.prepareStatement(SQLConsulta);
            ps.execute();
            return true;
        }catch(SQLException e){
            System.err.println("ejecutarConsulta()"+e.getMessage());
            return false;
        }
    }

}
